/*********************************************************
 * G2search搜索引擎是初学之家（http://www.g2room.com）开发的一款基于Lucene的搜索引擎，
 * 对数据库及文本文件进行创建索引和搜索。
 * G2Search使用灵活的配置方式，能满足大多数搜索的需要，并提供友好的操作界面。
 * 
 * 初学之家(http://www.g2room.com)，提供Java、Javascript（js）、Jquery、
 * 等一些工具或常用功能的实现例子代码，希望能给初学者提供学习和工作上的帮助，
 * 也希望有想提供源代码的朋友能联系我，一起努力，提供更多、更全面、更详细的
 * 一些初学代码例子及经验，帮助更多的人。
 * 
 * 我的联系方式：E-Mail：g2room@163.com
 * 网址：http://www.g2room.com
 * QQ：天涯（1173930590）
 * QQ交流群：323642758
 * 
 * 本站内容为提供各种java、javascript(JS)常用的工具源代码、实例（示例）、
 * 基本配置、教程、手册等；目前Java代码提供的工具（或转换）例子代码如下：
 * BASE64转换工具、bytes相关操作、email收发、文件操作（读写、拷贝、遍历、
 * 多线程copy等）、json格式转换、日志（Log4j）操作工具、Lucene搜索引擎的
 * 创建索引和搜索、各种不同Map的使用、定时器（Quartz）的使用例子、Socket的
 * 连接传输数据例子、WebService的例子及一些常用的工具类如String、Date及
 * JDK自带的一些工具类及函数的使用例子。
 * 
 * 说明：如需直接使用本站的例子代码，请保留此说明
 * 
 ********************************************************/
package com.g2room.tools.db.db2po;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.Map;

/**
 * 从数据库读取数据库信息生成Po类
 *
 * @createTime: Jan 9, 2014 2:44:26 PM
 * @author: <a href="mailto:g2room@163.com">天涯</a>
 * @version: 0.1
 * @lastVersion: 0.1
 * @updateTime: 
 * @updateAuthor: <a href="mailto:g2room@163.com">天涯</a>
 * @changesSum: 
 * 
 */
public class CreatePo4Db {
	// 包名
	private static String packageStr = "com.carry6.generic.model.po.temp";
	// 保存文件路径
	private static String javaFilePath = "D:/workspace/code/eclipse/stargame/carry6/generic/src/test/java/com/carry6/generic/model/po/temp";
	
	public static void main(String[] args) {
		createJava();
	}
	
	/**
	 * 生成java文件
	 *
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Jan 9, 2014 5:08:05 PM
	 */
	public static void createJava() {
		DataSourceModel ds = new DataSourceModel();
		ds.setDriver(PropertiesUtil.getDBConfByKey("DB.Driver"));
		ds.setUsername(PropertiesUtil.getDBConfByKey("DB.UserName"));
		ds.setPassword(PropertiesUtil.getDBConfByKey("DB.PassWord"));
		ds.setUrl(PropertiesUtil.getDBConfByKey("DB.URL"));
		DbUtil dbUtil = new DbUtil(ds);
		Map<String, String> tables = dbUtil.getTablesByStatus();
		StringBuilder textSb;
		String importDate = "import java.util.Date;";
		String importBigDecimal = "import java.math.BigDecimal;";
		boolean isComment = true;
		String comment = "";
		String field;
		for (String tableName : tables.keySet()) {
			String tn = StringUtil.hump4Underline(tableName);
			tn = StringUtil.capitalize(tn);
			textSb = new StringBuilder("package "+packageStr+";\n\n");
			textSb.append("import com.carry6.generic.model.po.BasePo;\n\n");
			if(!StringUtil.isBlank(tables.get(tableName))) {
				textSb.append("/**");
				textSb.append(tables.get(tableName));
				textSb.append("**/\n");
			}
			String classStr = "public class " + tn + " extends BasePo{";
			textSb.append(classStr + "\n");
			Map<String, String> colns = dbUtil.getColumns(tableName, isComment);
			for (String key : colns.keySet()) {
				if(isComment) {
					String comm = key.substring(key.indexOf(" ") + 1);
					if(!StringUtil.isBlank(comm)) {
						comment = "/* " + comm + "*/\n";
					} else {
						comment = "";
					}
					field = key.substring(0, key.indexOf(" "));
				} else {
					field = key;
				}
				field = StringUtil.hump4Underline(field);
				// 首字母大写
				String fieldCap = StringUtil.capitalize(field);
				// 首字母小写
				String fieldMin = StringUtil.minuscule(field);
				String javaType = colns.get(key);
				System.out.println(key + "=====" + javaType);
				if (javaType.equals(DbConstant.FIELD_TYPE_DATE)
						&& textSb.indexOf(importDate) < 0) {
					textSb.insert(textSb.indexOf(";") + 1,
					"\nimport java.util.Date;");
				}
				if (javaType.equals(DbConstant.FIELD_TYPE_BIGDECIMAL)
						&& textSb.indexOf(importBigDecimal) < 0) {
					textSb.insert(textSb.indexOf(";") + 1,
							"\nimport java.math.BigDecimal;");
				}
				// 属性组装
				textSb.insert(textSb.indexOf(classStr) + 1 + classStr.length(),
						comment + "private " + javaType + " " + fieldMin + ";\n");
				// get方法组装
				textSb.append("public " + javaType + " get" + fieldCap
						+ "() {\n");
				textSb.append("return " + fieldMin + ";\n}\n\n");
				// set方法组装
				textSb.append("public void set" + fieldCap + "("
						+ javaType + " " + fieldMin + ") {\n");
				textSb.append("this." + fieldMin + " = " + fieldMin
						+ ";\n}\n\n");
			}
			textSb.append("}");
			if (null != textSb) {
				try {
					createDynamicFile(textSb.toString(), tn+ ".java");
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	public static void createDynamicFile(String content, String fileName) throws Exception {
        //得到写文件路径
        File file = new File(javaFilePath);
        //如果目录不存在，则创建目录
        if(!file.exists())
            file.mkdirs();
        //写文件
        OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(javaFilePath + "//" + fileName),"utf-8");
        out.write(content);
        out.flush();
        out.close();
    }
}
